using Avalonia.Controls;
using Avalonia.Controls.Templates;
using SidebarStarted.ViewModels;
using System;

namespace SidebarStarted
{
    public class ViewLocator : IDataTemplate
    {
        public Control? Build(object? data)
        {
            if (data is null)
                return null;

            var name = data.GetType().FullName!.Replace("ViewModel", "View", StringComparison.Ordinal);
            var type = Type.GetType(name);

            if (type != null)
            {
                var control = (Control)Activator.CreateInstance(type)!;
                control.DataContext = data;
                return control;
            }

            return new TextBlock { Text = "Not Found: " + name };
        }

        public bool Match(object? data)
        {
            return data is ViewModelBase;
        }

        // 另一个写法
        // private readonly Dictionary<Type, Func<Control?>> _locator = new();
        // public ViewLocator()
        // {
        //     RegisterViewFactory<MainViewModel, MainWindow>();
        //     RegisterViewFactory<HomePageViewModel, HomePageView>();
        //     RegisterViewFactory<ButtonPageViewModel, ButtonPageView>();
        // }
        // public Control Build(object? data)
        // {
        //     if (data is null)
        //     {
        //         return new TextBlock { Text = "No VM provided" };
        //     }
        //
        //     _locator.TryGetValue(data.GetType(), out var factory);
        //
        //     return factory?.Invoke() ?? new TextBlock { Text = $"VM Not Registered: {data.GetType()}" };
        // }
        // private void RegisterViewFactory<TViewModel, TView>()
        //     where TViewModel : class
        //     where TView : Control
        //     => _locator.Add(
        //         typeof(TViewModel),
        //         Design.IsDesignMode
        //             ? Activator.CreateInstance<TView>
        //             : Ioc.Default.GetService<TView>);
    }
}